package xmlParse;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXPersonService extends DefaultHandler {
	public List<FntInfo> readXML(InputStream inStream) {

		try {

			SAXParserFactory spf = SAXParserFactory.newInstance();

			SAXParser saxParser = spf.newSAXParser(); // 创建解析器

			FntInfoHandler handler = new FntInfoHandler();

			saxParser.parse(inStream, handler);

			inStream.close();

			return handler.getFntInfo();

		} catch (Exception e) {

			e.printStackTrace();

		}

		return null;

	}

	private final class FntInfoHandler extends DefaultHandler {
		private List<FntInfo> fntInfos = null;

		private FntInfo currentWord;

		private String tagName = null;// 当前解析的元素标签

		public List<FntInfo> getFntInfo() {
			return fntInfos;

		}

		/*
		 * 
		 * 接收文档的开始的通知。
		 */

		@Override
		public void startDocument() throws SAXException {

			fntInfos = new ArrayList<FntInfo>();

		}

		/*
		 * 
		 * 接收字符数据的通知。
		 */

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {

		}

		/*
		 * 
		 * 接收元素开始的通知。
		 * 
		 * 参数意义如下：
		 * 
		 * namespaceURI：元素的命名空间
		 * 
		 * localName ：元素的本地名称（不带前缀）
		 * 
		 * qName ：元素的限定名（带前缀）
		 * 
		 * atts ：元素的属性集合
		 */

		@Override
		public void startElement(String namespaceURI, String localName,
				String qName, Attributes atts) throws SAXException {

			if (localName.equals("glyph")) {
				currentWord = new FntInfo();
				this.currentWord.setFirString(atts.getValue("ch"));
				this.currentWord.setWord_originPos( atts.getValue("origin"));
				this.currentWord.setWord_size(atts.getValue("size"));
			}
			
			

			this.tagName = localName;

		}

		/*
		 * 
		 * 接收文档的结尾的通知。
		 * 
		 * 参数意义如下：
		 * 
		 * uri ：元素的命名空间
		 * 
		 * localName ：元素的本地名称（不带前缀）
		 * 
		 * name ：元素的限定名（带前缀）
		 */

		@Override
		public void endElement(String uri, String localName, String name)
				throws SAXException {

			if (localName.equals("glyph")) {

				fntInfos.add(currentWord);

				currentWord = null;

			}

			this.tagName = null;

		}
	}

}
